﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Series.Sunburst
{
	public class Sunburst
	{

		/// <summary>
		/// string
		/// 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
		/// </summary>
		public String id { get; set; }

		/// <summary>
		/// string
		/// 系列名称，用于tooltip的显示，legend 的图例筛选，在 setOption 更新数据和配置项时用于指定对应的系列。
		/// </summary>
		public String name { get; set; }

		/// <summary>
		/// number
		/// 所有图形的 zlevel 值。
		/// zlevel用于 Canvas 分层，不同zlevel值的图形会放置在不同的 Canvas 中，Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
		/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
		/// </summary>
		public int zlevel { get; set; } = 0;

		/// <summary>
		/// number
		/// 组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
		/// z相比zlevel优先级更低，而且不会创建新的 Canvas。
		/// </summary>
		public int z { get; set; } = 2;

		/// <summary>
		/// Array
		/// 旭日图的中心（圆心）坐标，数组的第一项是横坐标，第二项是纵坐标。
		/// 支持设置成百分比，设置成百分比时第一项是相对于容器宽度，第二项是相对于容器高度。
		/// 使用示例：
		/// // 设置成绝对的像素值
		/// center: [400, 300]
		/// // 设置成相对的百分比
		/// center: ['50%', '50%']
		/// </summary>
		public List<object> center { get; set; } = new List<object>() { "50%", "50%" };

		/// <summary>
		/// number,string,Array
		/// 旭日图的半径。可以为如下类型：
		/// number：直接指定外半径值。
		/// string：例如，'20%'，表示外半径为可视区尺寸（容器高宽中较小一项）的 20% 长度。
		/// Array.<number|string>：数组的第一项是内半径，第二项是外半径。每一项遵从上述 number string 的描述。
		/// </summary>
		public dynamic radius { get; set; } = "[0, '75%']";

		/// <summary>
		/// Array
		/// series-sunburst.data 的数据格式是树状的，例如：
		/// [{
		///     name: 'parent1',
		///     value: 10,          // 可以不写父元素的 value，则为子元素之和；
		///                         // 如果写了，并且大于子元素之和，可以用来表示还有其他子元素未显示
		///     children: [{
		///         value: 5,
		///         name: 'child1',
		///         children: [{
		///             value: 2,
		///             name: 'grandchild1',
		///             itemStyle: {
		///                 // 每个数据可以有自己的样式，覆盖 series.itemStyle 和 level.itemStyle
		///             },
		///             label: {
		///                 // 标签样式，同上
		///             }
		///         }]
		///     }, {
		///         value: 3,
		///         name: 'child2'
		///     }],
		///     itemStyle: {
		///         // parent1 的图形样式，不会被后代继承
		///     },
		///     label: {
		///         // parent1 的标签样式，不会被后代继承
		///     }
		/// }, {
		///     name: 'parent2',
		///     value: 4
		/// }]
		/// </summary>
		public List<object> data { get; set; }

		/// <summary>
		/// Object
		/// label 描述了每个扇形块中，文本标签的样式。
		/// 优先级：series.data.label > series.levels.label > series.label。
		/// 图形上的文本标签，可用于说明图形的一些数据信息，比如值，名称等，label选项在 ECharts 2.x 中放置于itemStyle下，在 ECharts 3 中为了让整个配置项结构更扁平合理，label 被拿出来跟 itemStyle 平级，并且跟 itemStyle 一样拥有 emphasis 状态。
		/// </summary>
		public WUDI.ECharts.Series.Sunburst.Label.Label label { get; set; }

		/// <summary>
		/// Object
		/// 旭日图扇形块的样式。
		/// 可以在 series.itemStyle 定义所有扇形块的样式，也可以在 series.levels.itemStyle 定义每一层扇形块的样式，还可以在 series.data.itemStyle 定义每个扇形块单独的样式，这三者的优先级从低到高。也就是说，如果定义了 series.data.itemStyle，将会覆盖 series.itemStyle 和 series.levels.itemStyle。
		/// 优先级：series.data.itemStyle > series.levels.itemStyle > series.itemStyle。
		/// ECharts 中，通常使用 emphasis 表示鼠标移动到图形上后的高亮状态。对于旭日图而言，我们引入了另两种状态：highlight 表示由于高亮了某个扇形块引起的其他相关扇形块的高亮；downplay 表示除了 highlight 扇形块之外的被淡化的扇形块。参见 highlightPolicy。
		/// </summary>
		public WUDI.ECharts.Series.Sunburst.ItemStyle.ItemStyle itemStyle { get; set; }

		/// <summary>
		/// string
		/// 当鼠标移动到一个扇形块时，可以高亮相关的扇形块。如果其值为 'descendant'，则会高亮该扇形块和后代元素，其他元素将被淡化（downplay，参见 itemStyle）；如果其值为 'ancestor'，则会高亮该扇形块和祖先元素；如果其值为 'self' 则只高亮自身；'none' 则不会淡化其他元素。
		/// 上面的例子 highlightPolicy 是默认值 'descendant'，我们通过 dispatchAction 触发了旭日图中某个数据块的高亮操作（相当于将鼠标移动到下图中的 target 扇形块中）。目标扇形块将采用 emphasis 的样式（在本例中是为红色），和目标扇形块相关的扇形块（由 highlightPolicy 决定哪些扇形块是相关的）采用 highlight 的样式（橙色），其他扇形块采用 downplay 的样式（灰色）。而如果没有高亮对象，则所有扇形块都采用默认的样式。样式定义是类似这样的：
		/// itemStyle: {
		///     color: 'yellow',
		///     borderWidth: 2
		/// },
		/// emphasis: {
		///     itemStyle: {
		///         color: 'red'
		///     }
		/// },
		/// highlight: {
		///     itemStyle: {
		///         color: 'orange'
		///     }
		/// },
		/// downplay: {
		///     itemStyle: {
		///         color: '#ccc'
		///     }
		/// }
		/// 而如果将 highlightPolicy 设为 'ancestor'，则会得到这样的效果：
		/// </summary>
		public String highlightPolicy { get; set; } = "descendant";

		/// <summary>
		/// boolean,string
		/// 点击节点后的行为。可取值为：
		/// false：节点点击无反应。
		/// 'rootToNode'：点击节点后以该节点为根结点。
		/// 'link'：如果节点数据中有 link 点击节点后会进行超链接跳转。
		/// </summary>
		public dynamic nodeClick { get; set; } = "rootToNode";

		/// <summary>
		/// string,Function
		/// 扇形块根据数据 value 的排序方式，如果未指定 value，则其值为子元素 value 之和。默认值 'desc' 表示降序排序；还可以设置为 'asc' 表示升序排序；null 表示不排序，使用原始数据的顺序；或者用回调函数进行排列：
		/// function(nodeA, nodeB) {
		///     return nodeA.getValue() - nodeB.getValue();
		/// }
		/// </summary>
		public dynamic sort { get; set; } = "desc";

		/// <summary>
		/// boolean
		/// 如果数据没有 name，是否需要渲染文字。
		/// </summary>
		public Boolean renderLabelForZeroData { get; set; } = false;

		/// <summary>
		/// Object
		/// 鼠标悬停后的配置项。
		/// </summary>
		public WUDI.ECharts.Series.Sunburst.Emphasis.Emphasis emphasis { get; set; }

		/// <summary>
		/// Object
		/// 鼠标悬停后相关扇形块的配置项。参见 highlightPolicy。
		/// </summary>
		public WUDI.ECharts.Series.Sunburst.Highlight.Highlight highlight { get; set; }

		/// <summary>
		/// Object
		/// 鼠标悬停后不相关扇形块的配置项。参见 highlightPolicy。
		/// </summary>
		public WUDI.ECharts.Series.Sunburst.Downplay.Downplay downplay { get; set; }

		/// <summary>
		/// Array
		/// 多层配置
		/// 旭日图是一种有层次的结构，为了方便同一层样式的配置，我们提供了 levels 配置项。它是一个数组，其中的第 0 项表示数据下钻后返回上级的图形，其后的每一项分别表示从圆心向外层的层级。
		/// 例如，假设我们没有数据下钻功能，并且希望将最内层的扇形块的颜色设为红色，文字设为蓝色，可以这样设置：
		/// series: {
		///     // ...
		///     levels: [
		///         {
		///             // 留给数据下钻点的空白配置
		///         },
		///         {
		///             // 最靠内测的第一层
		///             itemStyle: {
		///                 color: 'red'
		///             },
		///             label: {
		///                 color: 'blue'
		///             }
		///         },
		///         {
		///             // 第二层 ...
		///         }
		///     ]
		/// }
		/// </summary>
		public List<object> levels { get; set; } = new List<object>() {  };

		/// <summary>
		/// boolean
		/// 是否开启动画。
		/// </summary>
		public Boolean animation { get; set; } = true;

		/// <summary>
		/// number
		/// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
		/// </summary>
		public int animationThreshold { get; set; } = 2000;

		/// <summary>
		/// number
		/// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果：
		/// animationDuration: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public int animationDuration { get; set; } = 1000;

		/// <summary>
		/// string
		/// 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
		/// </summary>
		public String animationEasing { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
		/// 如下示例：
		/// animationDelay: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelay { get; set; } = 0;

		/// <summary>
		/// number,Function
		/// 数据更新动画的时长。
		/// 支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果：
		/// animationDurationUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public dynamic animationDurationUpdate { get; set; } = 500;

		/// <summary>
		/// string
		/// 数据更新动画的缓动效果。
		/// </summary>
		public String animationEasingUpdate { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
		/// 如下示例：
		/// animationDelayUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelayUpdate { get; set; } = 0;

	}
}
